home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1998 September / Macworld (1998-09).dmg / Shareware World / Info / For Developers / Jon’s Commands 2.0.5 / Snag Object Demo / main.c next >
C/C++ Source or Header  |  1997-01-04  |  7KB  |  212 lines

  1. /*
  2.     File: :JonsCommands:Snag Object Demo:main.c 
  3.  
  4.     Contains:    Example code for using resources created by "snag object" osax.
  5.     
  6.     Written by:    Wayne Walrath & Jon Pugh
  7.     
  8.     Copyright:    © 1996 by Jon Pugh <jonpugh@netcom.com>, all rights reserved.
  9.                 Free use is granted, although I would like my name in your about box.
  10.  
  11.     Change History (most recent first):
  12.  
  13.      6/23/96     Jon Pugh        Expanded examples
  14.      6/3/96        Wayne Walrath    Initial example
  15.  
  16. */
  17.  
  18.  
  19. #include <string.h>
  20. #include <stddef.h>
  21. #include <stdlib.h>
  22. #include <stdio.h>
  23. #include <SIOUX.h>
  24.  
  25. #define        kSnagObjType    'obj '
  26.  
  27. static char *AskLine( const char *msg, char *s)
  28. {
  29.     printf("%s", msg);
  30.     gets( s );
  31.     printf("\n");
  32.     return( s );
  33. }
  34.  
  35. static void PrintObjList( void )
  36. {
  37.     OSErr    err = noErr;
  38.     short    count, rID, j;
  39.     Handle    rHandle;
  40.     ResType    rType;
  41.     Str255    rName;
  42.     
  43.     count = Count1Resources( kSnagObjType );
  44.     if( count ) {
  45.  
  46.         printf("Snag objects in this file: \n");
  47.         SetResLoad( FALSE );                /* do not need resource, just info */
  48.         for( j=1; j <= count; j++ ) {
  49.             rHandle = GetIndResource(kSnagObjType, j );
  50.             GetResInfo( rHandle, &rID, &rType, rName );
  51.             printf("\t%6d, %s\n", rID, PtoCstr(rName));
  52.         }
  53.         SetResLoad(TRUE);                /* better do this! */
  54.  
  55.     
  56.     }else
  57.         printf("No snag objects found in application's resource fork.\n");
  58. }
  59.  
  60. static void SendFinderEvent( DescType eventClass, DescType eventID, Handle objHandle )
  61. {
  62.     OSErr    err = noErr;
  63.     AppleEvent    event, reply;
  64.     AEDesc        targetAddress;
  65.     OSType        finderSig = 'MACS';
  66.     
  67.     event.dataHandle = reply.dataHandle = targetAddress.dataHandle = nil;
  68.     if(! (err = AECreateDesc( typeApplSignature, &finderSig, sizeof( finderSig ), &targetAddress ) ))
  69.         if(!  (err = AECreateAppleEvent( eventClass, eventID, &targetAddress, kAutoGenerateReturnID, kAnyTransactionID, &event ) ))
  70.             if(! (err = AEPutKeyPtr( &event, keyDirectObject, typeObjectSpecifier, *objHandle, GetHandleSize(objHandle) )))
  71.                 if(! (err =  AESend( &event, &reply, kAENoReply, kAENormalPriority, kAEDefaultTimeout, nil, nil ) ))        
  72.                 {
  73.                     // do something with reply
  74.                 }else{
  75.                         // check keyErrorNumber if you care
  76.                 }
  77.     if( event.dataHandle )    (void)AEDisposeDesc( &event );
  78.     if( reply.dataHandle )    (void)AEDisposeDesc( &reply );
  79.     if( targetAddress.dataHandle )    (void)AEDisposeDesc( &targetAddress );
  80. }
  81.  
  82. static void GetFinderDataEvent( Handle objHandle, DescType desiredType, AEDesc *result)
  83. {
  84.     OSErr        err = noErr;
  85.     OSErr        returnedErr = noErr;
  86.     AppleEvent    event, reply;
  87.     AEDesc        targetAddress;
  88.     long        actualSize;
  89.     DescType    theType;
  90.     OSType        finderSig = 'MACS';
  91.     
  92.     event.dataHandle = reply.dataHandle = targetAddress.dataHandle = result->dataHandle = nil;
  93.     result->descriptorType = typeNull;
  94.     if(! (err = AECreateDesc( typeApplSignature, &finderSig, sizeof( finderSig ), &targetAddress ) )) {
  95.         if(!  (err = AECreateAppleEvent (kAECoreSuite, kAEGetData, &targetAddress, kAutoGenerateReturnID, kAnyTransactionID, &event ) )) {
  96.             if(! (err = AEPutKeyPtr( &event, keyDirectObject, typeObjectSpecifier, *objHandle, GetHandleSize(objHandle) ))) {
  97.                 if(! (err = AEPutKeyPtr( &event, keyAERequestedType, typeType, &desiredType, sizeof(desiredType) ))) {
  98.                     if(! (err = AESend( &event, &reply, kAEWaitReply, kAENormalPriority, kAEDefaultTimeout, nil, nil ) )) {
  99.                         returnedErr = noErr;
  100.                         err = AEGetKeyPtr( &reply, keyErrorNumber, typeShortInteger, &theType, (Ptr) &returnedErr, sizeof(returnedErr), &actualSize);
  101.                         if (err == errAEDescNotFound || returnedErr == noErr) {
  102.                             if (err = AEGetParamDesc( &reply, keyAEResult, typeAEList, result ))
  103.                                 printf("AEGetParamDesc error #%d\n", err);
  104.                         }
  105.                         else {
  106.                             if (returnedErr == errAENoSuchObject)
  107.                                 printf ("No such object\n");
  108.                             else
  109.                                 printf("keyErrorNumber error #%d\n", returnedErr);
  110.                         }
  111.                     }
  112.                     else
  113.                         printf("AESend error #%d\n", err);
  114.                 }
  115.                 else
  116.                     printf("AEPutKeyPtr type error #%d\n", err);
  117.             }
  118.             else
  119.                 printf("AEPutKeyPtr direct object error #%d\n", err);
  120.         }
  121.         else
  122.             printf("AECreateAppleEvent error #%d\n", err);
  123.     }
  124.     else
  125.         printf("AECreateDesc error #%d\n", err);
  126.     if( event.dataHandle )    (void)AEDisposeDesc( &event );
  127.     if( reply.dataHandle )    (void)AEDisposeDesc( &reply );
  128.     if( targetAddress.dataHandle )    (void)AEDisposeDesc( &targetAddress );
  129. }
  130.  
  131. void main( void )
  132. {
  133.     OSErr        err = noErr;
  134.     Handle        objHandle = nil;
  135.     AEDesc        theList;
  136.     DescType    theKey, theType;
  137.     long        i, n, theSize;
  138.     AEDesc        temp;
  139.     char        input[1000];
  140.     
  141.     // set up some SIOUX settings
  142.     SIOUXSettings.asktosaveonclose = FALSE;
  143.  
  144.     printf("Demonstration of Jon's Commands Snag Object osax. hacked by <wkw@acmetech.com>\n\n");
  145.     printf("Two events using snagged object specifiers are sent to the Finder; the first\nin an open event which opens every folder in your top level directory, the second to close every one of the same folders.\n\n");
  146.  
  147.     while( true ) {
  148.         AskLine( "Trick 1 (Wayne's open & close)\n" 
  149.         "Trick 2 (Jon's open control panels paths)\n"
  150.         "Trick 3 (Jon's hidden process creators)\n"
  151.         "Trick 4 (Jon's hidden process path)\n"
  152.         "(1,2,3,4): ", input );        
  153.         if( input[0] == '1' ) {
  154.  
  155.             // send open every folder of disk 1 event
  156.             objHandle = GetResource( kSnagObjType, 130 );
  157.             if( objHandle ){
  158.                 HLock( objHandle );
  159.                 SendFinderEvent( 'aevt', 'odoc', objHandle );
  160.                 SendFinderEvent( 'core', 'clos', objHandle );
  161.                 HUnlock( objHandle );
  162.                 ReleaseResource( objHandle );
  163.                 objHandle = nil;
  164.             }
  165.         }
  166.         else {
  167.             if (input[0] == '2') {
  168.                 objHandle = GetResource( kSnagObjType, 129 );
  169.                 theType = typeChar;
  170.             }
  171.             else if (input[0] == '3') {
  172.                 objHandle = GetResource( kSnagObjType, 131 );
  173.                 theType = typeType;
  174.             }
  175.             else if (input[0] == '4') {
  176.                 objHandle = GetResource( kSnagObjType, 132 );
  177.                 theType = typeChar;
  178.             }
  179.             if( objHandle ){
  180.                 HLock( objHandle );
  181.                 GetFinderDataEvent( objHandle, theType, &theList );
  182.                 HUnlock( objHandle );
  183.                 ReleaseResource( objHandle );
  184.                 objHandle = nil;
  185.                 if (theList.dataHandle != nil) {
  186.                     if (theList.descriptorType != typeAEList) {
  187.                         err = AECoerceDesc(&theList, typeAEList, &temp);
  188.                         if (err == noErr) {
  189.                             AEDisposeDesc(&theList);
  190.                             theList = temp;
  191.                         } else {
  192.                             printf("AECoerceDesc error #%d, descType = '%4c'\n", err, theList.descriptorType);
  193.                         }
  194.                     }
  195.                     // we just try to coerce things to text
  196.                     n = 0;
  197.                     err = AECountItems(&theList, &n);
  198.                     for (i = 1; i <= n; ++i) {
  199.                         err = AEGetNthPtr(&theList, i, typeChar, &theKey, &theType, &input[0], sizeof(input)-1, &theSize);
  200.                         if (err == noErr) {
  201.                             input[theSize] = 0;
  202.                             printf("%s\n", input);
  203.                         }else{
  204.                             printf("AEGetNthPtr error #%d\n", err);
  205.                         }
  206.                     }
  207.                     printf("\n");
  208.                 }
  209.             }
  210.         }
  211.     }
  212. }